import store from '@/store'

/**
 * Created by PanJiaChen on 16/11/18.
 */

/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUsername(str) {
  const valid_map = ['admin', 'editor']
  return valid_map.indexOf(str.trim()) >= 0
}

/**
 *  element 基于业务封装校验规则
 */

/**
 * 校验邮箱
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 */
export function validateEMail(rule, value, callback) {
  const reg = /^([a-zA-Z0-9]+[-_\.]?)+@[a-zA-Z0-9]+\.[a-z]+$/
  if (value === '' || value === undefined || value === null) {
    callback()
  } else {
    if (!reg.test(value)) {
      callback(new Error())
    } else {
      callback()
    }
  }
}

/**
 * 是否身份证号码
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 */
export function validateIdNo(rule, value, callback) {
  const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
  if (value === '' || value === undefined || value === null) {
    callback()
  } else {
    if ((!reg.test(value)) && value !== '') {
      callback(new Error('请输入正确的身份证号码'))
    } else {
      callback()
    }
  }
}

/**
 * 验证内容是否包含英文数字以及下划线
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 */
export function isPassword(rule, value, callback) {
  const reg = /^[_a-zA-Z0-9]+$/
  if (value === '' || value === undefined || value === null) {
    callback()
  } else {
    if (!reg.test(value)) {
      callback(new Error('仅由英文字母，数字以及下划线组成'))
    } else {
      callback()
    }
  }
}

/**
 * 账号必须为6-20位字母和数字组合
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 * @returns
 */
export const validateCode = (rule, value, callback) => {
  if (!value) {
    return callback(new Error('请输入账号'))
  }
  if (!/^(?![0-9]*$)(?![a-zA-Z]*$)[a-zA-Z0-9]{6,20}$/.test(value)) {
    callback(new Error('账号必须为6-20位字母和数字组合'))
  } else {
    callback()
  }
}
/**
 * 密码必须包含数字和大小写字母，长度至少为 6 位，最多32位
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 * @returns
 */
export const validatePasswordTwo = (rule, value, callback) => {
  if (!value) {
    return callback(new Error('请输入密码'))
  }
  if (!/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{6,32}$/.test(value)) {
    callback(new Error('密码必须包含数字和大小写字母，长度至少为 6 位，最多32位'))
  } else {
    callback()
  }
}

/**
 * 密码必须包含数字和字母(不区分大小写)，长度至少为 8 位，最多16位
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 * @returns
 */
export const validatePassword = (rule, value, callback) => {
  if (!value) {
    return callback(new Error('请输入密码'))
  }
  if (!/^(?=.*[a-zA-Z])(?=.*\d)[^]{8,16}$/.test(value)) {
    callback(new Error('密码必须包含数字和英文字母，长度至少为8位，最多16位'))
  } else {
    callback()
  }
}

/**
 * 支付密码必须数字，长度为8位
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 * @returns
 */
export const validatePayPassword = (rule, value, callback) => {
  if (!value) {
    return callback(new Error('请输入支付密码'))
  }
  if (!/^\d{8}$/.test(value)) {
    callback(new Error('支付密码必须为8位数字'))
  } else {
    callback()
  }
}

/**
 * 用户名小写字母及数字，且不能超过50个字符
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 * @returns
 */
export const validateAccountUser = (rule, value, callback) => {
  if (!value) {
    return callback(new Error())
  }
  if (!/^[a-z\d]{5,50}$/.test(value)) {
    // 返回错误信息在 message 编辑
    callback(new Error())
  } else {
    callback()
  }
}
/**
 * 付款地址只能由字母和数字组成，最大长度为128个字符。
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 * @returns
 */
export const validateReceiptAddress = (rule, value, callback) => {
  if (!value) {
    return callback(new Error())
  }
  if (!/^[a-zA-Z\d]{1,128}$/.test(value)) {
    // 返回错误信息在 message 编辑
    callback(new Error())
  } else {
    callback()
  }
}

/**
 * 只能输入100以下的数字，小数点支持后两位
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 * @returns
 */
export const validateMinHundredTwoDecimal = (rule, value, callback) => {
  // TODO 还有问题
  if (!value) {
    return callback(new Error())
  }
  if (!/(^[0-9]{1,2}$)|(^[0-9]{1,2}[\.]{1}[0-9]{1,2}$)/.test(value)) {
    // 返回错误信息在 message 编辑
    callback(new Error())
  } else {
    callback()
  }
}

/**
 * 创建角色校验
 * 最长 63 个字符，只能包含小写字母、数字及分隔符("-")，且必须以小写字母或数字开头及结尾
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 * @returns
 */
export const validateRoleUser = (rule, value, callback) => {
  if (!value) {
    return callback(new Error())
  }
  if (!/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/.test(value)) {
    // 返回错误信息在 message 编辑
    callback(new Error())
  } else {
    callback()
  }
}
/**
 * 创建集群校验
 * f开头，数字结尾
 * @param {*} rule
 * @param {*} value
 * @param {*} callback
 * @returns
 */
export const validateClusterName = (rule, value, callback) => {
  if (!/^[fF][0-9]+$/.test(value)) {
    // 返回错误信息在 message 编辑
    callback(new Error('集群以f开头数字结尾'))
  } else {
    callback()
  }
}

/**
 * 校验
 * @param {String} name 用户名
 * @param {Number} category 分类(1=平台 2=矿池 3=集群)
 * @param {Number} check_type 检查类型(0=用户名 1=邮箱 2=角色名 3=矿池名 4=集群名称)
 * @param {*} callback el-form 回调函数
 */
export const validateNameExist = async(name, category, check_type, callback) => {
  const postData = {
    name: name,
    category,
    check_type
  }
  const res = await DetectionName(postData)
  const { code } = res.header
  if (code === 1005) {
    callback(new Error('该名称已存在'))
  } else if (code === 1006) {
    callback()
  }
}

/**
 * 移除用户判断是否正确
 * @param {String} name 用户名
 * @param {*} callback el-form 回调函数
 */
export const validateRemoveName = async(name, validName, callback) => {
  if (name !== validName) {
    callback(new Error('输入有误，请重新输入'))
  } else {
    callback()
  }
}

export const validateAddress = (coinType, value, callback) => {
  if (!value) {
    return callback(new Error('收款方地址不能为空'))
  } else {
    switch (coinType) {
      case 'FIL':
        /^f\w{40}/.test(value) ? callback() : callback(new Error('FIL收款地址错误'))
        break
      case 'TRC20-USDT':
        /^T\w{33}$/.test(value) ? callback() : callback(new Error('TRC-USDT收款地址错误'))
        break
      case 'TRX':
        /^T\w{33}$/.test(value) ? callback() : callback(new Error('TRX收款地址错误'))
        break
      case 'FLOW':
        /^0x\w{16}$/.test(value) ? callback() : callback(new Error('FLOW收款地址错误'))
        break
      case 'IOST':
        /\w/.test(value) ? callback() : callback(new Error('IOST收款地址错误'))
        break
      case 'XCH':
        /^xch\w{59}/.test(value) ? callback() : callback(new Error('XCH收款地址错误'))
        break
      case 'ATOM':
        /^cosmos\w{39}/.test(value) ? callback() : callback(new Error('ATOM收款地址错误'))
        break
      default:
        // ETH UNI
        /^0x\w{40}$/.test(value) ? callback() : callback(new Error('ETH UNI收款地址错误'))
        break
    }
  }
}
/**
 * 判断输入最多是否8位小数
 * @param {String} name 用户名
 * @param {*} callback el-form 回调函数
 */
export const validateEightDecimal = async(rule, val, callback) => {
  if (!/^[0-9]+(\.[0-9]{0,8})?$/.test(val)) {
    callback(new Error('输入有误，最多支持8位小数，请重新输入'))
  } else {
    callback()
  }
}
/**
 * 判断手机号
 * @param {String} name 用户名
 * @param {*} callback el-form 回调函数
 */
export const validatePhone = (rule, value, callback) => {
  if (value === '') {
    return callback(new Error('手机号不能为空'))
  } else {
    if (!/^1[3456789]\d{9}$/.test(value)) {
      callback(new Error('请输入正确手机号'))
    }
    callback()
  }
}
